home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok89 / amigaguide / hyperapp.mod < prev    next >
Text File  |  1993-11-04  |  16KB  |  563 lines

  1. MODULE HyperApp;
  2.  
  3. (*---------------------------------------------------------------------------
  4. ** An example for using AmigaGuide.
  5. **
  6. ** This is a translation of the HyperApp.c example supplied with the
  7. ** AmigaGuide v1.24 package.
  8. **---------------------------------------------------------------------------
  9. ** Oberon: Amiga-Oberon v3.00, F. Siebert / A+L AG
  10. **---------------------------------------------------------------------------
  11. ** 14-Apr-93 [lars] created
  12. ** 14-Apr-93 [lars] actual
  13. **---------------------------------------------------------------------------
  14. *)
  15.  
  16. IMPORT ag:AmigaGuide, e:Exec, gr:Graphics, i:Intuition, sys:SYSTEM, Utility,
  17.        (* $IF Debug *) Debug, (* $END *)
  18.        io, NoGuru, Requests, Strings;
  19.  
  20. (*-------------------------------------------------------------------------*)
  21.  
  22. TYPE
  23.   AppInfoPtr = UNTRACED POINTER TO AppInfo;
  24.   EMenuItemPtr = UNTRACED POINTER TO EMenuItem;
  25.  
  26.   AppInfo = STRUCT
  27.     window     : i.WindowPtr;          (* Window pointer *)
  28.     done       : BOOLEAN;          (* Done yet? *)
  29.     amigaGuide : ag.AmigaGuideContext;      (* Pointer to the AmigaGuide context *)
  30.     region     : LONGINT;          (* Region that the mouse if over *)
  31.     font       : gr.TextFontPtr;      (* Window font *)
  32.   END;
  33.  
  34.   EMenuItem = STRUCT
  35.     (menuItem : i.MenuItem)    (* Embedded menu structure *)
  36.     menuID : LONGINT;           (* Menu ID *)
  37.   END;
  38.  
  39. (*-------------------------------------------------------------------------*)
  40.  
  41. (* Context ID's to be sent to AmigaGuide *)
  42.  
  43. TYPE
  44.   tContext = ARRAY 6 OF e.STRPTR;
  45.  
  46. CONST
  47.   context = tContext ( sys.ADR("MAIN"), sys.ADR("QUIT"), sys.ADR("GADGET"),
  48.                sys.ADR("OKAY"), sys.ADR("CANCEL"), NIL);
  49.  
  50.  
  51. (*-------------------------------------------------------------------------*)
  52.  
  53. (* Simple little prompts to display within the application window *)
  54.  
  55. TYPE
  56.   tQuickHelp = ARRAY 6 OF e.STRPTR;
  57.  
  58. CONST
  59.   quickhelp = tQuickHelp ( sys.ADR("HyperApp Main Window"),
  60.                sys.ADR(""),
  61.                sys.ADR("Transmogrify Objects"),
  62.                sys.ADR("Positive Quit"),
  63.                sys.ADR("Negative Quit"),
  64.                NIL
  65.              );
  66.  
  67. (*-------------------------------------------------------------------------*)
  68.  
  69. (* Table of application functions *)
  70.  
  71. TYPE
  72.   FuncTable = PROCEDURE (ai : AppInfoPtr);    (* Type of application functions *)
  73.   Funcs = ARRAY 6 OF FuncTable;
  74.  
  75. PROCEDURE ^ MainFunc   (ai : AppInfoPtr);
  76. PROCEDURE ^ QuitFunc   (ai : AppInfoPtr);
  77. PROCEDURE ^ GadgetFunc (ai : AppInfoPtr);
  78. PROCEDURE ^ OkayFunc   (ai : AppInfoPtr);
  79. PROCEDURE ^ CancelFunc (ai : AppInfoPtr);
  80.  
  81. CONST
  82.   funcs = Funcs ( MainFunc, QuitFunc, GadgetFunc, OkayFunc, CancelFunc, NIL );
  83.  
  84. (*-------------------------------------------------------------------------*)
  85.  
  86. (* Various for the gui *)
  87.  
  88. CONST
  89.   Topaz8 = gr.TextAttr (sys.ADR("topaz.font"), 8, SHORTSET{}, SHORTSET{} );
  90.   IText3 = i.IntuiText ( 0, 0, gr.jam1, 2, 1, sys.ADR(Topaz8),
  91.              sys.ADR("Quit"), NIL );
  92.   MenuItem1 = EMenuItem ( NIL, 0, 0, 142, 9,
  93.               {i.itemText, i.commSeq, i.itemEnabled, i.highComp},
  94.               LONGSET{}, sys.ADR(IText3), NIL, 'Q', NIL, 0,
  95.               1
  96.             );
  97.   Menu1 = i.Menu ( NIL, 2, 0, 64, 0, {i.menuEnabled}, sys.ADR("Project"),
  98.            sys.ADR(MenuItem1), 0, 0, 0, 0 );
  99.  
  100. TYPE
  101.   BorderData = ARRAY 10 OF INTEGER;
  102.  
  103. CONST
  104.   BData1 = BorderData ( 0, 0, 94, 0, 94, 13, 0, 13, 0, 0 );
  105.   BData2 = BorderData ( 0, 0, 94, 0, 94, 13, 0, 13, 0, 0 );
  106.  
  107.   Border1 = i.Border ( 0, 0, 1, 0, gr.jam1, 5, sys.ADR(BData1), NIL );
  108.   Border2 = i.Border ( 0, 0, 1, 0, gr.jam1, 5, sys.ADR(BData2), NIL );
  109.  
  110.   IText1 = i.IntuiText ( 1, 0, gr.jam2, 26, 3, sys.ADR(Topaz8), sys.ADR("Cancel"), NIL );
  111.   IText2 = i.IntuiText ( 1, 0, gr.jam2, 40, 3, sys.ADR(Topaz8), sys.ADR("OK"), NIL );
  112.  
  113.   Gadget3 = i.Gadget ( NIL, -120, -18, 95, 14, {i.gRelBottom, i.gRelRight},
  114.                { i.relVerify }, i.boolGadget, sys.ADR(Border1), NIL,
  115.                sys.ADR(IText1), LONGSET{}, NIL, 4, NIL );
  116.   Gadget2 = i.Gadget ( sys.ADR(Gadget3), 12, -18, 95, 14, {i.gRelBottom},
  117.                { i.relVerify }, i.boolGadget, sys.ADR(Border2), NIL,
  118.                sys.ADR(IText2), LONGSET{}, NIL, 3, NIL );
  119.   Gadget1 = i.Gadget ( sys.ADR(Gadget2), 12, 27, -40, -48,
  120.                i.gadgHComp + {i.gRelWidth, i.gRelHeight, i.selected},
  121.                { i.toggleSelect, i.relVerify }, i.boolGadget,
  122.                NIL, NIL, NIL, LONGSET{}, NIL, 2, NIL );
  123.  
  124.   WinTags = Utility.Tags2 ( i.waMenuHelp, e.true, Utility.done, 0 );
  125.  
  126.   NewWindowStructure1 = i.ExtNewWindow (
  127.     0, 0, 640, 100, -1, -1,
  128.     LONGSET{ i.rawKey, i.closeWindow, i.menuPick, i.menuHelp, i.gadgetUp,
  129.          i.mouseMove },
  130.     LONGSET{ i.windowSizing, i.windowDrag, i.windowDepth, i.windowClose,
  131.          i.reportMouse, i.sizeBRight, i.activate, i.noCareRefresh,
  132.          i.nwExtended},
  133.     sys.ADR(Gadget1), NIL, sys.ADR("HyperApp (Press HELP over Gadget or Menu)"),
  134.     NIL, NIL, 320, 50, -1, -1, {i.wbenchScreen},
  135.     sys.ADR(WinTags)
  136.   );
  137.  
  138. VAR
  139.   newWin : i.ExtNewWindow;
  140.   b1, b2 : i.Border;
  141.  
  142. (*-------------------------------------------------------------------------*)
  143. PROCEDURE PointInBox (x, y : INTEGER; box : i.IBox) : BOOLEAN;
  144.  
  145. (* Determine if a point is within a rectangle *)
  146.  
  147. BEGIN
  148.   RETURN   (x >= box.left)
  149.      & (x <= (box.left + box.width))
  150.      & (y >= box.top)
  151.      & (y <= (box.top + box.height));
  152. END PointInBox;
  153.  
  154. (*-------------------------------------------------------------------------*)
  155. PROCEDURE gadgetBox (g : i.GadgetPtr; domain : i.IBoxPtr; VAR box : i.IBox);
  156.  
  157. (* Find the rectangle of a gadget *)
  158.  
  159. BEGIN
  160.   (* Set the 'normal' rectangle *)
  161.   box.left := g.leftEdge;
  162.   box.top := g.topEdge;
  163.   box.width := g.width;
  164.   box.height := g.height;
  165.  
  166.   (* Check for relativity *)
  167.   IF i.gRelRight  IN g.flags THEN INC (box.left, domain.width - 1); END;
  168.   IF i.gRelBottom IN g.flags THEN INC (box.top, domain.height - 1); END;
  169.   IF i.gRelWidth  IN g.flags THEN INC (box.width, domain.width); END;
  170.   IF i.gRelHeight IN g.flags THEN INC (box.height, domain.height); END;
  171. END gadgetBox;
  172.  
  173. (*-------------------------------------------------------------------------*)
  174. PROCEDURE HandleMenuEvent (msg : i.IntuiMessagePtr);
  175.  
  176. (* Process menu events *)
  177.  
  178.   VAR
  179.     win : i.WindowPtr;
  180.     ai    : AppInfoPtr;
  181.     selection : INTEGER;
  182.     item : EMenuItemPtr;
  183. BEGIN
  184.   win := msg.idcmpWindow;
  185.   ai := win.userData;
  186.   selection := msg.code;
  187.  
  188.   (* Turn off the menu button *)
  189.   INCL (win.flags, i.rmbTrap);
  190.  
  191.   (* Process all menu events *)
  192.   WHILE selection # 0 DO
  193.     (* Get the MenuItem structure address *)
  194.     item := i.ItemAddress (win.menuStrip^, selection);
  195.     IF item # NIL THEN
  196.       funcs[item.menuID] (ai);
  197.       (* Get the next selection *)
  198.       selection := item.menuItem.nextSelect;
  199.     ELSE selection := 0;
  200.     END;
  201.   END;
  202.   (* Turn menu events back on. *)
  203.   EXCL (win.flags, i.rmbTrap);
  204. END HandleMenuEvent;
  205.  
  206. (*-------------------------------------------------------------------------*)
  207. PROCEDURE HandleMenuHelp (msg : i.IntuiMessagePtr);
  208.  
  209. (* Process MenuHelp events *)
  210.  
  211.   VAR
  212.     win : i.WindowPtr;
  213.     ai : AppInfoPtr;
  214.     item : EMenuItemPtr;
  215.     mnum, inum, snum : INTEGER;
  216. BEGIN
  217.   win := msg.idcmpWindow;
  218.   ai := win.userData;
  219.  
  220.   mnum := i.MenuNum (msg.code);
  221.   inum := i.ItemNum (msg.code);
  222.   snum := i.SubNum (msg.code);
  223.  
  224.   io.WriteString ("m "); io.WriteInt (mnum, 1);
  225.   io.WriteString ("i "); io.WriteInt (inum, 1);
  226.   io.WriteString ("s "); io.WriteInt (snum, 1);
  227.   io.WriteLn;
  228.  
  229.   (* Get the MenuItem structure address *)
  230.   item := i.ItemAddress (win.menuStrip^, msg.code);
  231.   IF item # NIL THEN
  232.     (* Set the AmigaGuide context *)
  233.     sys.SETREG(0, ag.SetAmigaGuideContext (ai.amigaGuide, item.menuID, NIL));
  234.  
  235.     (* Display the node *)
  236.     sys.SETREG(0, ag.SendAmigaGuideContext (ai.amigaGuide, NIL));
  237.   ELSE
  238.     (* No selectable item where help was pressed *)
  239.     io.WriteString ("No item here\n");
  240.   END;
  241. END HandleMenuHelp;
  242.  
  243. (*-------------------------------------------------------------------------*)
  244. PROCEDURE HandleMouseMove (msg : i.IntuiMessagePtr);
  245.  
  246. (* Process MouseMove events *)
  247.  
  248.   VAR
  249.     win : i.WindowPtr;
  250.     ai : AppInfoPtr;
  251.     gad : i.GadgetPtr;
  252.     box : i.IBox;
  253.     region : LONGINT;
  254.     tx, ty, bx, by : INTEGER;
  255. BEGIN
  256.   win := msg.idcmpWindow;
  257.   ai := win.userData;
  258.   gad := win.firstGadget;
  259.  
  260.   IF (msg.mouseX < 0) OR (msg.mouseX > win.width) OR
  261.      (msg.mouseY < 0) OR (msg.mouseY > win.height)
  262.   THEN
  263.     region := -1;
  264.   ELSE
  265.     region := 0;
  266.     (* Step through the gadgets to see which one the pointer was over *)
  267.     WHILE (gad # NIL) & (region = 0) DO
  268.       (* Calculate the gadget rectangle *)
  269.       gadgetBox (gad, sys.VAL(i.IBoxPtr, sys.ADR(win.leftEdge)), box);
  270.  
  271.       (* Is the pointer within this gadget? *)
  272.       IF PointInBox (msg.mouseX, msg.mouseY, box) THEN
  273.     (* Is it not a system gadget? *)
  274.     IF gad.gadgetType >= 0 THEN
  275.       (* Set the region *)
  276.       region := gad.gadgetID;
  277.     END;
  278.       END;
  279.  
  280.       (* Get the next gadget *)
  281.       gad := gad.nextGadget;
  282.     END;
  283.   END;
  284.  
  285.   IF region # ai.region THEN
  286.     tx := win.borderLeft + 8;
  287.     ty := win.borderTop + 2;
  288.     bx := win.width - (win.borderRight + 8);
  289.     by := ty + win.rPort.txHeight;
  290.  
  291.     gr.SetDrMd (win.rPort, gr.jam1);
  292.  
  293.     (* Clear the quick help region *)
  294.     gr.SetAPen (win.rPort, 0);
  295.     gr.RectFill (win.rPort, tx, ty, bx, by);
  296.  
  297.     (* Remember the region *)
  298.     ai.region := region;
  299.  
  300.     (* Display the quick help if within the window *)
  301.     IF region >= 0 THEN
  302.       gr.SetAPen (win.rPort, 1);
  303.       gr.Move (win.rPort, tx, ty + win.rPort.txBaseline);
  304.       gr.Text (win.rPort, quickhelp[region]^, Strings.Length (quickhelp[region]^));
  305.     END;
  306.   END;
  307. END HandleMouseMove;
  308.  
  309. (*-------------------------------------------------------------------------*)
  310. PROCEDURE HandleGadgetHelp (msg : i.IntuiMessagePtr);
  311.  
  312. (* Process GadgetHelp events *)
  313.  
  314.   VAR
  315.     win : i.WindowPtr;
  316.     ai : AppInfoPtr;
  317.     gad : i.GadgetPtr;
  318.     box : i.IBox;
  319.     region : LONGINT;
  320.     sysg : LONGINT;
  321. BEGIN
  322.   win := msg.idcmpWindow;
  323.   ai := win.userData;
  324.   gad := win.firstGadget;
  325.  
  326.   region := 0;
  327.  
  328.   (* Step through the gadgets to see which one the pointer was over *)
  329.   WHILE (gad # NIL) & (region = 0) DO
  330.     (* Calculate the gadget rectangle *)
  331.     gadgetBox (gad, sys.VAL(i.IBoxPtr, sys.ADR(win.leftEdge)), box);
  332.  
  333.     (* Is the pointer within this gadget? *)
  334.     IF PointInBox (msg.mouseX, msg.mouseY, box) THEN
  335.       (* Is it a system gadget? *)
  336.       IF gad.gadgetType < 0 THEN
  337.     sysg := sys.VAL (INTEGER, sys.LSH(sys.VAL(SET, gad.gadgetType) * {4..7}, -4));
  338.     (* Set the region *)
  339.     region := sys.VAL (LONGINT, LONGSET{ag.sysGads}) + sysg;
  340.       ELSE
  341.     (* Set the region *)
  342.     region := gad.gadgetID;
  343.       END;
  344.     END;
  345.  
  346.     (* Get the next gadget *)
  347.     gad := gad.nextGadget;
  348.   END;
  349.  
  350.   (* Set the AmigaGuide context. *)
  351.   sys.SETREG(0, ag.SetAmigaGuideContext (ai.amigaGuide, region, NIL));
  352.  
  353.   (* Display the current node *)
  354.   sys.SETREG(0, ag.SendAmigaGuideContext (ai.amigaGuide, NIL));
  355. END HandleGadgetHelp;
  356.  
  357. (*-------------------------------------------------------------------------*)
  358. PROCEDURE HandleGadgetEvent (msg : i.IntuiMessagePtr);
  359.  
  360. (* Process Gadget events *)
  361.  
  362.   VAR
  363.     win : i.WindowPtr;
  364.     ai : AppInfoPtr;
  365.     gad : i.GadgetPtr;
  366. BEGIN
  367.   win := msg.idcmpWindow;
  368.   ai := win.userData;
  369.   gad := msg.iAddress;
  370.  
  371.   IF gad # NIL THEN funcs[gad.gadgetID] (ai); END;
  372. END HandleGadgetEvent;
  373.  
  374. (*-------------------------------------------------------------------------*)
  375. PROCEDURE HandleIDCMP (VAR ai : AppInfo);
  376.  
  377. (* Process Intuition messages *)
  378.  
  379.   VAR
  380.     win : i.WindowPtr;
  381.     imsg : i.IntuiMessagePtr;
  382. BEGIN
  383.   win := ai.window;
  384.  
  385.   LOOP
  386.     imsg := e.GetMsg (win.userPort);
  387.     IF imsg = NIL THEN EXIT; END;
  388.     IF      i.mouseMove    IN imsg.class THEN HandleMouseMove (imsg);
  389.     ELSIF i.closeWindow IN imsg.class THEN ai.done := TRUE;
  390.     ELSIF i.menuPick    IN imsg.class THEN HandleMenuEvent (imsg);
  391.     ELSIF i.menuHelp    IN imsg.class THEN HandleMenuHelp (imsg);
  392.     ELSIF i.gadgetUp    IN imsg.class THEN HandleGadgetEvent (imsg);
  393.     ELSIF (i.rawKey IN imsg.class) & (imsg.code = 95) THEN HandleGadgetHelp (imsg);
  394.     END;
  395.  
  396.     (* Reply to the message *)
  397.     e.ReplyMsg (imsg);
  398.   END;
  399. END HandleIDCMP;
  400.  
  401. (*-------------------------------------------------------------------------*)
  402. PROCEDURE DisplayError (err : LONGINT);
  403. BEGIN
  404.   io.WriteString (ag.GetAmigaGuideString (err)^);
  405.   io.WriteLn;
  406. END DisplayError;
  407.  
  408. (*-------------------------------------------------------------------------*)
  409. PROCEDURE HandleAmigaGuide (VAR ai : AppInfo);
  410.  
  411. (* Process AmigaGuide messages *)
  412.  
  413.   VAR
  414.     agm : ag.AmigaGuideMsgPtr;
  415. BEGIN
  416.   LOOP
  417.     agm := ag.GetAmigaGuideMsg (ai.amigaGuide);
  418.     IF agm = NIL THEN EXIT; END;
  419.  
  420.     (* check message types *)
  421.     CASE agm.type OF
  422.     | ag.activeToolID:      (* AmigaGuide is ready for us *)
  423.     | ag.toolCmdReplyID:  (* This is a reply to our cmd *)
  424.        IF agm.priRet # 0 THEN DisplayError (agm.secRet); END;
  425.     | ag.toolStatusID:      (* This is a status message *)
  426.        IF agm.priRet # 0 THEN DisplayError (agm.secRet); END;
  427.     | ag.shutdownMsgID:   (* Shutdown message *)
  428.        IF agm.priRet # 0 THEN DisplayError (agm.secRet); END;
  429.     ELSE (* ignore it *)
  430.     END;
  431.  
  432.     (* Reply to the message *)
  433.     ag.ReplyAmigaGuideMsg (agm);
  434.   END;
  435. END HandleAmigaGuide;
  436.  
  437. (*-------------------------------------------------------------------------*)
  438. (* The called back functions *)
  439.  
  440. PROCEDURE * MainFunc (ai : AppInfoPtr);
  441. BEGIN io.WriteString ("I don't do anything...\n"); END MainFunc;
  442.  
  443.  
  444. PROCEDURE * QuitFunc (ai : AppInfoPtr);
  445. BEGIN
  446.   (* All done, guys *)
  447.   ai.done := TRUE;
  448. END QuitFunc;
  449.  
  450.  
  451. PROCEDURE * GadgetFunc (ai : AppInfoPtr);
  452. BEGIN io.WriteString ("Pressed the big gadget\n"); END GadgetFunc;
  453.  
  454.  
  455. PROCEDURE * OkayFunc (ai : AppInfoPtr);
  456. BEGIN
  457.   (* All done, guys *)
  458.   ai.done := TRUE;
  459. END OkayFunc;
  460.  
  461.  
  462. PROCEDURE * CancelFunc (ai : AppInfoPtr);
  463. BEGIN
  464.   (* All done, guys *)
  465.   ai.done := TRUE;
  466. END CancelFunc;
  467.  
  468. (*-------------------------------------------------------------------------*)
  469. PROCEDURE Main ();
  470.  
  471.   VAR
  472.     nag : ag.NewAmigaGuide;
  473.     ai : AppInfo;
  474.     sigr, sigi, sigb : LONGSET;
  475. BEGIN
  476.   (* Open the window font *)
  477.   ai.font := gr.OpenFont (Topaz8);
  478.   IF ai.font = NIL THEN io.WriteString ("Can't open font 'topaz 8'.\n");
  479.   ELSE
  480.     (* Open the window *)
  481.     ai.window := i.OpenWindow (NewWindowStructure1);
  482.     IF ai.window = NIL THEN io.WriteString ("Can't open window.\n");
  483.     ELSE
  484.       sigr := LONGSET{};
  485.       sigi := LONGSET{};
  486.       sigb := LONGSET{};
  487.  
  488.       (* Set the window font *)
  489.       gr.SetFont (ai.window.rPort, ai.font);
  490.  
  491.       (* Set the menu *)
  492.       sys.SETREG(0, i.SetMenuStrip (ai.window, Menu1));
  493.  
  494.       (* Remember the AppInfo *)
  495.       ai.window.userData := sys.ADR(ai);
  496.  
  497.       (* Show that we're not done running the application yet *)
  498.       ai.done := FALSE;
  499.  
  500.       (* Set the application base name *)
  501.       nag.baseName := sys.ADR("HyperApp");
  502.  
  503.       (* Set the document name *)
  504.       nag.name := sys.ADR("hyperapp.guide");
  505.  
  506.       (* establish the base name to use for hypertext ARexx port *)
  507.       nag.clientPort := sys.ADR("AGAPP_HELP");
  508.  
  509.       (* Set up the context table *)
  510.       nag.context := sys.ADR(context);
  511.  
  512.       (* Open the help system *)
  513.       ai.amigaGuide := ag.OpenAmigaGuideAsync (nag, NIL);
  514.  
  515.       (* Get our signal bits *)
  516.       sigb := ag.AmigaGuideSignal (ai.amigaGuide);
  517.       sigi := LONGSET{ai.window.userPort.sigBit};
  518.  
  519.       (* Clear the AmigaGuide context *)
  520.       sys.SETREG(0, ag.SetAmigaGuideContext (ai.amigaGuide, 0, NIL));
  521.  
  522.       (* Continue until done *)
  523.       WHILE ~ai.done DO
  524.     (* Wait for something to happen *)
  525.     sigr := e.Wait (sigb + sigi);
  526.  
  527.     (* Process Intuition messages *)
  528.     IF sigr * sigi # LONGSET{} THEN HandleIDCMP (ai); END;
  529.  
  530.     (* Process AmigaGuide messages *)
  531.     IF sigr * sigb # LONGSET{} THEN HandleAmigaGuide (ai); END;
  532.       END;
  533.  
  534.       (* Shutdown the help system *)
  535.       ag.CloseAmigaGuide (ai.amigaGuide);
  536.  
  537.       (* Do we have a menu? *)
  538.       IF ai.window.menuStrip # NIL THEN
  539.     (* Clear it *)
  540.     i.ClearMenuStrip (ai.window);
  541.       END;
  542.  
  543.       (* Close the application window *)
  544.       i.CloseWindow (ai.window);
  545.     END;
  546.  
  547.     (* Close the font *)
  548.     gr.CloseFont (ai.font);
  549.   END;
  550. END Main;
  551.  
  552. (*-------------------------------------------------------------------------*)
  553.  
  554. BEGIN
  555.   Requests.Assert (ag.base # NIL, "Can't open amigaguide.library");
  556.   newWin := NewWindowStructure1;
  557.   b1 := Border1;
  558.   b2 := Border2;
  559.   Main;
  560. END HyperApp.
  561.  
  562. (***************************************************************************)
  563.